Programming distributed web-applications today is a painful process that requires programmers to understand many different technologies (e.g., HyperText Markup Language (HTML), Cascading Style Sheets (CSS), JavaScript, Extended Markup Language (XML), Structured Query Language (SQL), Web Service Definition Language (WSDL), Simple Object Access Protocol (SOAP) . . . ) and to make decisions on how to partition their programs between server-side and client-side execution in advance.
Traditionally, web-applications are written with a server-side bias. A browser submits requests for HTML pages that are dynamically generated on the server-side and pushed back as a whole to the browser. Thus, most of the computation is done by the server. Furthermore, since the HTTP protocol that is used to communicate between a browser and a web-server is stateless, the server-side program simply handles single requests and then terminates. It has no intrinsic memory of previous interactions with the browser, nor does it maintain any state until servicing the next request. As a result, the burden is on the programmer to maintain cross-request state using one many features that server-side frameworks provide.
Postmodern AJAX (Asynchronous JavaScript and XML) style web-applications, take a more client centric view where a client explicitly pulls fragments of pages from a web-server. This style of web-applications is closer to standard client programs where most of the computation is done on the client, and the web-server is primarily employed as provider of web-services, not to serve HTML pages. One significant difference between AJAX applications and conventional client applications is that it is hard for AJAX applications to operate in partially connected scenarios. Further, it is difficult to locally persist state between runs of a program.
As mentioned above, both client and server centric programming models require programmers to understand many different technologies and force programmers to decide upfront how to split computation between client and server. This causes programmers to turn their code inside out to deal with asynchronous callbacks, among other distributed programming issues. Matters are further complicated by the fact that they cannot user standard libraries that they may have used to develop conventional applications (e.g., forms, base class . . . ).